/**
* @公司名称: 上海恒生聚源数据服务有限公司
* @部门    ：产品开发三部
* @工程名  : UDEP
*/
package org.jony.JProject.objectPool;

import java.util.Vector;

/**
 * @类说明:
 * @作者    ：Jony
 * @E-mail  : lij@gildata.com
 * @创建日期: 2011-8-22上午9:01:07
 * @版本号  ：V.1.0
 */
public class ObjectPool {

	private ParameterObject paramObj;   //该对象池的属性参数对象  
    private Class classType;            //该对象池中所存放对象的类型  
    private Object currentObj;          //该对象池当前可以借出的对象  
    private Vector pool;                //用于存放对象的池, Vector是一个stack, 所以pool是一个对象栈池  
      
    /** 
     *  
     * @param paramObj 
     * @param classType 
     */  
    public ObjectPool(ParameterObject paramObj, Class classType) {  
  
        //ObjectPool利用一个java.util.Vector作为可扩展的对象池，  
        //并通过它的构造函数来指定池化对象的 Class类型及对象池的一些属性  
        this.paramObj = paramObj;  
        this.classType = classType;  
        pool = new Vector<Object>();  
  
        //创建所有对象并放进pool中  
        for(int i=0;i<this.paramObj.getMaxCount();i++){  
            PoolableObjectFactory objFactory = PoolableObjectFactory.getInstance();  
            pool.add(objFactory.createObject(classType));  
        }  
    }  
      
      
    /** 
     *  
     * @return 
     */  
    public Object borrowObject() {  
          
        if(pool.size()>0){  
              
            System.out.println("pool中有可用的对象" + pool.size() + "个");  
            //如果pool中有可用的对象就返回pool栈中第一个可用的对象  
            currentObj = pool.firstElement();  
              
            //删除pool中刚借出的对象，注意removeElementAt(0)只是删除pool中指向该对象的引用，该对象在内存中还是存在的  
            pool.removeElementAt(0);  
            return currentObj;  
        } else {  
            System.out.println("pool中没有可用的对象, 请耐心等待");  
            //如果当前池中无对象可用，就只能等待其它线程返回对象到池中  
            synchronized(this) {  
                try {  
                    wait();  
                } catch (InterruptedException e) {  
                    System.out.println(e.getMessage());  
                    e.printStackTrace();  
                }  
                currentObj = pool.firstElement();  
                pool.removeElementAt(0);  
                return currentObj;  
            }  
        }         
    }  
      
      
    /** 
     * 当return一个对象时, pool就会追加该对象 
     * @param obj 
     */  
    public void returnObject(Object obj) {  
        // 确保对象具有正确的类型  
        //if (obj.getClass().isInstance(classType)) {  
            //TODO: 因为obj是之前对象栈池的第一个元素, 如果该对象是有状态的需要考虑是否还原到对象的初始状态  
            //例如: obj是一个BufferString, 在之前的一次使用中append了一个字串"hello", 当return到pool中的  
            //时候就要清楚该"hello"字串, 否则当该对象下一次被借出并append新的字串时会包含上一次使用时append  
            //的"hello"字串  
            //System.out.println("obj is: "+obj.toString()+", 归还对象到pool中");  
            ((StringBuffer)obj).delete(0, ((StringBuffer)obj).length());    //恢复对象初始状态  
            pool.addElement(obj);   //把使用完的对象放回pool中  
            synchronized (this) {  
                notifyAll();  
            }  
        //} else {  
        //  throw new IllegalArgumentException("该对象池不能存放指定的对象类型");  
        //}  
    }
}
